package org.japo.java.jdbc.samples;

import com.mysql.jdbc.exceptions.jdbc4.CommunicationsException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author José A. Pacheco Ondoño - joanpaon@gmail.com
 */
public class ConexionAgenda {

    // Nombre de la base de datos
    private final String BD = "agenda";

    // Nombre cualificado del driver JDBC para ODBC (No Java8)
//    private final String DRIVER_ACCESS = "sun.jdbc.odbc.JdbcOdbcDriver";
    //
    // Nombre cualificado del driver JDBC para MySQL
    private final String DRIVER_MySQL = "com.mysql.jdbc.Driver";

    // Protocolo del driver JDBC para ODBC (No Java8)
//    private final String PROTOCOLO_ACCESS = "jdbc:odbc";
    //
    // Protocolo del driver JDBC para MySQL
    private final String PROTOCOLO_MySQL = "jdbc:mysql";

    // Servidor
    private final String SERVIDOR = "localhost";
    private final int PUERTO = 3306;

    // Usuario (MySQL)
    private final String USUARIO = "usuario";
    private final String PASSWORD = "usuario";

    // Cadena de conexión de Access
//    private final String cadenaAccess = PROTOCOLO_ACCESS + ":" + BD;
    //
    // Cadena de conexión de MySQL
    private final String cadenaMySQL = ""
            + PROTOCOLO_MySQL + "://"
            + SERVIDOR + ":"
            + PUERTO + "/"
            + BD;

    // Conexión a la base de datos
    private Connection con = null;

    public static void main(String[] args) {
        // Crea una instancia de la propia clase
        ConexionAgenda aplicacion = new ConexionAgenda();

        // Ejecuta el aplicativo
        aplicacion.lanzarAplicacion();
    }

    private void lanzarAplicacion() {
        try {
            // Registro manual del driver JDBC para Access
//            Class.forName(DRIVER_ACCESS);

            // Registro manual del driver JDBC para MySQL
            Class.forName(DRIVER_MySQL);

            // Apertura de la conexión a la base de datos
            System.out.println("Abriendo " + BD);
            con = DriverManager.getConnection(cadenaMySQL, USUARIO, PASSWORD);
            System.out.println("Base de datos " + BD + " abierta");

            // --- HACER ALGO ---
            
            // Metadatos de la base de datos
            DatabaseMetaData dmd = con.getMetaData();

            // Mostrar algunos datos de la base de datos
            System.out.println("Usuario .........: " + dmd.getUserName());
            System.out.println("Base de datos ...: " + dmd.getDatabaseProductName());
            System.out.println("Version SGBD ....: " + dmd.getDatabaseProductVersion());
            System.out.println("Driver JDBC .....: " + dmd.getDriverName());
            System.out.println("Versión JDBC ....: " + dmd.getJDBCMajorVersion()
                    + "." + dmd.getJDBCMinorVersion());
        } catch (SQLException ex) {
            System.out.println("Error al conectar con la base de datos");
            Logger.getLogger(ConexionAgenda.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            System.out.println("Error al cargar el driver de la base de datos");
//            Logger.getLogger(ConexionAgenda.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                // Cierre de la conexión a la base de datos
                System.out.println("Cerrando " + BD);
                con.close();
                System.out.println("Base de datos " + BD + " cerrada");
            } catch (NullPointerException ex) {
                System.out.println("No se ha podido conectar con el SGBD ");
                Logger.getLogger(ConexionAgenda.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex) {
                System.out.println("Error al cerrar la base de datos");
                Logger.getLogger(ConexionAgenda.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
